﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;
using System.Configuration;
using System.Reflection;
using System.Collections;
using System.IO;



namespace Torpedo
{
    public partial class Főablak : Form
    {

        #region adattagok

            //a debug konzol kezelőjét ebben tároljuk
            IntPtr DebugConsoleWindow;
            //ennyit várunk a végén a konzol bezárásra
            int Kilépési_várakozás = 0;
            Tabla sajáttábla;
            Kommunikacio komm;
            string betöltött_fájl = "";
            private List<Hajo> hajolist=new List<Hajo>();
            private int kirajzolthajoindex=-1;
            

        #endregion adattagok

        #region konstruktor,destruktor

            //főablak konstruktor
            public Főablak()
            {
                InitializeComponent();
                
            }

            //főablak destruktor
            ~Főablak()
            {

            }

        #endregion konstruktor,destruktor

        #region Dllimport

            //a debug konzol ablak elrejtéséhez és megjelenítéséhez szükséges külső fgv-ek
            [DllImport("user32.dll")]
            public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
            [DllImport("user32.dll")]
            static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
            [DllImport("user32.dll")]
            private static extern bool GetWindowRect(IntPtr hWnd, ref Rectangle rect);


        #endregion Dllimport

        #region metódusok
            
            //a főmenü kilépés menüpontjának lekezelése
            private void kilépésToolStripMenuItem1_Click(object sender, EventArgs e)
            {
                this.Close();
            }
            
            //Főablak betöltésekor ezt tesszük
            private void Főablak_Load(object sender, EventArgs e)
            {
                DebugConsoleWindow = FindWindow(null, Properties.Resources.DEBUG_CONSOLE_TITLE);
                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
                AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];
                this.Text = titleAttribute.Title;
               

                // ablakhely beállítás
                if (Properties.Settings.Default.Ablak_hely != null)
                {
                    this.Location = Properties.Settings.Default.Ablak_hely ;
                }
                // ablakméret beállítás
                if (Properties.Settings.Default.Ablak_méret != null)
                {
                    this.Size = Properties.Settings.Default.Ablak_méret ;
                }

                //az elmentett debugconsole setting alapján beállítjuk a konzolt és a menüjét
                if (DebugConsoleWindow != IntPtr.Zero)
                    if (Properties.Settings.Default.Show_Debug_console)
                    {
                        //Hide debug console
                        ShowWindow(DebugConsoleWindow, 1);
                        debugKonzolToolStripMenuItem.Checked = true;
                    }
                    else
                    {
                        //Hide debug console
                        ShowWindow(DebugConsoleWindow, 0);
                        debugKonzolToolStripMenuItem.Checked = false;
                    }
                Console.WriteLine(Properties.Resources.PROGRAM_SETTINGS_LOAD);

                //és legyen a form az aktív ablak
                this.Activate();

                komm = new Kommunikacio("Kommunikációs objektum 1");
                pictureBox1.MouseWheel += new MouseEventHandler(pictureBox1_MouseWheel);
             
            }

            //bezáráskor ezt tesszük
            private void Főablak_FormClosing(object sender, FormClosingEventArgs e)
            {

                //return;

                if (MessageBox.Show(Properties.Resources.PROGRAM_BEZARAS_KERDES , Properties .Resources .PROGRAM_BEZARAS_ABLAK_FEJLEC, MessageBoxButtons.OKCancel,MessageBoxIcon.Warning ,MessageBoxDefaultButton.Button2 ) == DialogResult.Cancel)
                    e.Cancel = true; //ha mégsem lépünk ki
                else //egyébként kilépünk
                {
                    //mentéshez beállítjuk az ablak helyét és méretét
                    //ha minimalizálva volt, akkor a minimailzálás előtti hely és méret...
                    if (this.WindowState == FormWindowState.Normal)
                    {
                        Properties.Settings.Default.Ablak_méret = this.Size;
                        Properties.Settings.Default.Ablak_hely = this.Location;
                    }
                    else
                    {
                        Properties.Settings.Default.Ablak_méret = this.RestoreBounds.Size;
                        Properties.Settings.Default.Ablak_hely = this.RestoreBounds.Location;
                    }
                    //mentéshez beállítjuk a debug console állapotát tároló beállítást
                    Properties.Settings.Default.Show_Debug_console = debugKonzolToolStripMenuItem.Checked;

                    //ide kérdezzük le, hol is van a konzol ablak
                    Rectangle rect=new Rectangle();
                    GetWindowRect(DebugConsoleWindow, ref rect);

                    Properties.Settings.Default.Konzol_poz_x = rect.Left  ;
                    Properties.Settings.Default.Konzol_poz_y = rect.Top ;
                    Properties.Settings.Default.Konzol_méret_x = Console.WindowWidth;
                    Properties.Settings.Default.Konzol_méret_y = Console.WindowHeight;

                    //mentjük a beállításokat
 

                
                    Properties.Settings.Default.Save();
                    //ide menti alapértelmezésként:
                    Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
                    Console.WriteLine("Local user config path: {0}", config.FilePath);

                    Thread.Sleep(Kilépési_várakozás);


                }
            }
            
            //itt kezeljük le a debug konzol menüpontot
            private void debugKonzolToolStripMenuItem_Click(object sender, EventArgs e)
            {
                if (DebugConsoleWindow != IntPtr.Zero)
                    if (debugKonzolToolStripMenuItem.Checked)
                    {
                        //Hide debug console
                        ShowWindow(DebugConsoleWindow, 0); 
                        debugKonzolToolStripMenuItem.Checked = false;
                    }
                    else
                    {
                        //Hide debug console
                        ShowWindow(DebugConsoleWindow, 1); 
                        debugKonzolToolStripMenuItem.Checked = true;
                        //és legyen a form az aktív ablak
                        this.Activate();
                    }
            }

            //AboutBox
            private void aProgramrólToolStripMenuItem1_Click(object sender, EventArgs e)
            {
                AboutBox1 ab = new AboutBox1();
                ab.ShowDialog();
            }

            



            private void kommunikációIndításToolStripMenuItem_Click(object sender, EventArgs e)
            {
                komm.start();
            }



        #endregion metódusok

            void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
            {
                if (kirajzolthajoindex == -1) return;
                if (e.Delta < 0)
                    if (kirajzolthajoindex + 1 <= hajolist.Count - 1)
                    {
                        kirajzolthajoindex++;
                    }
                    else
                    {
                        kirajzolthajoindex = 0;
                    }
                if (e.Delta > 0)
                    if (kirajzolthajoindex - 1 >= 0)
                    {
                        kirajzolthajoindex--;
                    }
                    else
                    {
                        kirajzolthajoindex = hajolist.Count - 1;
                    }
                pictureBox1.Refresh();
            }

            private void hajófájlfeldolgozás(){
                StreamReader SR;
                string S;
                SR=File.OpenText(betöltött_fájl);
                S=SR.ReadLine();
                if (hajolist.Count>0)
                hajolist.Clear();

                List<string> hajosorok = new List<string>();
                
                string hPattern = "^(#|-)*$";
                string dbPattern = "^\\d+$";

                while(S!=null)
                {
                    //Console.WriteLine(S);
   
                    int darab = 0;
                    
                    if (System.Text.RegularExpressions.Regex.IsMatch(S, hPattern))
                    {
                        System.Console.WriteLine("{0}", S.Replace("-", " "));
                        hajosorok.Add(S);     
                    }

                    
                    if (S != null)
                        if (System.Text.RegularExpressions.Regex.IsMatch(S, dbPattern))
                        {
                            System.Console.WriteLine("darab:{0}",S);
                            darab = Convert.ToInt32(S);
                        }

                    if (darab > 0)
                    {
                        for (int i = 0; i < darab; i++)
                        {
                            Hajo h = new Hajo(hajosorok);
                            hajolist.Add(h); 
                        }
                        if (hajosorok.Count > 0)
                            hajosorok.Clear(); 
                    }

                    S = SR.ReadLine();

                }
                SR.Close();
                if (hajolist.Count > 0)
                {
                    kirajzolthajoindex = 0;
                    pictureBox1.Refresh();
                }
                
            }
            private void button1_Click(object sender, EventArgs e)
            {
                sajáttábla = new Tabla("saját tábla", Convert.ToInt32( maskedTextBox1.Text),splitContainer1.Panel1,this);
                sajáttábla = new Tabla("ellen tábla", Convert.ToInt32(maskedTextBox1.Text), splitContainer1.Panel2,this);
            }

            private void megnyitásToolStripMenuItem_Click(object sender, EventArgs e)
            {
                //beállítjuk a foldert, ahonnan töltünk...
                if (Properties.Settings.Default.data_path != "")
                    openFileDialog1.InitialDirectory = Properties.Settings.Default.data_path;
                if (Properties.Settings.Default.last_data_file != "")
                    openFileDialog1.FileName = Properties.Settings.Default.last_data_file;
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    try
                    {
                        //elmentjük a foldert, hogy legközelebb is innen töltsünk
                        Properties.Settings.Default.data_path = System.IO.Path.GetDirectoryName(openFileDialog1.FileName);
                        Properties.Settings.Default.last_data_file = System.IO.Path.GetFileName(openFileDialog1.FileName);
                        betöltött_fájl = openFileDialog1.FileName;
                        
                        //betoltott_adat_kiiras_label.Text = System.IO.Path.GetFileName(openFileDialog1.FileName);
                        //betoltott_adat_kiiras_label.ToolTipText = System.IO.Path.GetDirectoryName(openFileDialog1.FileName);
                        //Console.WriteLine("Betöltés rendben: " + betöltött_fájl);

                        hajófájlfeldolgozás();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.StackTrace);
                    }

                }
            }



            private void pictureBox1_Paint(object sender, PaintEventArgs e)
            {
                using (Font myFont = new Font("Courier New", 8))
                {
                    if (kirajzolthajoindex > -1)
                    {
                        e.Graphics.DrawString(hajolist[kirajzolthajoindex].getstring(), myFont, Brushes.Green, new Point(2, 2));

                    }
                    else
                    {

                    }
                }

            }

            private void pictureBox1_MouseEnter(object sender, EventArgs e)
            {
                pictureBox1.Focus();
            }

            private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
            {
                if (kirajzolthajoindex > -1)
                {
                    pictureBox1.DoDragDrop(hajolist[kirajzolthajoindex], DragDropEffects.Move);
                }

            }

            public void hajotorles()
            {
                hajolist.RemoveAt(kirajzolthajoindex);
                if (kirajzolthajoindex > hajolist.Count-1)
                    kirajzolthajoindex = -1;
            
                    
                pictureBox1.Refresh();
            }
    }
}
